home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 501-525 / disk_509 / multi_player / sources / playroutine.s < prev    next >
Text File  |  1992-05-06  |  11KB  |  555 lines

  1.                   ****************************************
  2.                   *** JamCrackerPro V1.0a play-routine ***
  3.                   ***   Originally coded by M. Gemmel  ***
  4.                   ***           Code optimised         ***
  5.                   ***         by Xag of Betrayal       ***
  6.                   ***    See docs for important info   ***
  7.                   ****************************************
  8.     incdir    "tom:asm/"
  9.     include    inc/macro.s
  10.  
  11. ; !!!!
  12.     XDEF    _pp_init,_pp_music,_pp_end
  13.     XREF    _adr_data
  14. ; !!!!
  15.  
  16. DMAWAIT        EQU    $12C    ;Change to suit
  17.  
  18.     *** Relative offset definitions ***
  19.  
  20.         RSRESET        ;Instrument info structure
  21. it_name        RS.B    31
  22. it_flags        RS.B    1
  23. it_size        RS.L    1
  24. it_address    RS.L    1
  25. it_sizeof        RS.W    0
  26.  
  27.         RSRESET        ;Pattern info structure
  28. pt_size        RS.W    1
  29. pt_address    RS.L    1
  30. pt_sizeof        RS.W    0
  31.  
  32.         RSRESET        ;Note info structure
  33. nt_period        RS.B    1
  34. nt_instr        RS.B    1
  35. nt_speed        RS.B    1
  36. nt_arpeggio    RS.B    1
  37. nt_vibrato    RS.B    1
  38. nt_phase        RS.B    1
  39. nt_volume        RS.B    1
  40. nt_porta        RS.B    1
  41. nt_sizeof        RS.W    0
  42.  
  43.         RSRESET        ;Voice info structure
  44. pv_waveoffset    RS.W    1
  45. pv_dmacon        RS.W    1
  46. pv_custbase    RS.L    1
  47. pv_inslen        RS.W    1
  48. pv_insaddress    RS.L    1
  49. pv_peraddress    RS.L    1
  50. pv_pers        RS.W    3
  51. pv_por        RS.W    1
  52. pv_deltapor    RS.W    1
  53. pv_porlevel    RS.W    1
  54. pv_vib        RS.W    1
  55. pv_deltavib    RS.W    1
  56. pv_vol        RS.W    1
  57. pv_deltavol    RS.W    1
  58. pv_vollevel    RS.W    1
  59. pv_phase        RS.W    1
  60. pv_deltaphase    RS.W    1
  61. pv_vibcnt        RS.B    1
  62. pv_vibmax        RS.B    1
  63. pv_flags        RS.B    1
  64. pv_sizeof        RS.W    0
  65.  
  66.         SECTION    BTLCRACKER_PLAYER,CODE_C
  67.  
  68.  
  69.     *** Initialise routine ***
  70.  
  71. _pp_init:
  72. ; !!!!
  73.         push.l    d0-d7/a0-a6
  74.         move.l    _adr_data,a0
  75. ; !!!!
  76.         addq.w    #4,a0
  77.         move.w    (a0)+,d0
  78.         move.w    d0,d1
  79.         move.l    a0,instable
  80.         mulu    #it_sizeof,d0
  81.         add.w    d0,a0
  82.  
  83.         move.w    (a0)+,d0
  84.         move.w    d0,d2
  85.         move.l    a0,patttable
  86.         mulu    #pt_sizeof,d0
  87.         add.w    d0,a0
  88.  
  89.         move.w    (a0)+,d0
  90.         move.w    d0,songlen
  91.         move.l    a0,songtable
  92.         add.w    d0,d0
  93.         add.w    d0,a0
  94.  
  95.         move.l    patttable(PC),a1
  96.         move.w    d2,d0
  97.         subq.w    #1,d0
  98. .l0:        move.l    a0,pt_address(a1)
  99.         move.w    (a1),d3        ;pt_size
  100.         mulu    #nt_sizeof*4,d3
  101.         add.w    d3,a0
  102.         addq.w    #pt_sizeof,a1
  103.         dbra    d0,.l0
  104.  
  105.         move.l    instable(PC),a1
  106.         move.w    d1,d0
  107.         subq.w    #1,d0
  108. .l1:        move.l    a0,it_address(a1)
  109.         move.l    it_size(a1),d2
  110.         add.l    d2,a0
  111.         add.w    #it_sizeof,a1
  112.         dbra    d0,.l1
  113.  
  114.         move.l    songtable(PC),pp_songptr
  115.         move.w    songlen(PC),pp_songcnt
  116.         move.l    pp_songptr(PC),a0
  117.         move.w    (a0),d0
  118.         mulu    #pt_sizeof,d0
  119.         add.l    patttable(PC),d0
  120.         move.l    d0,a0
  121.         move.l    a0,pp_pattentry
  122.         move.b    pt_size+1(a0),pp_notecnt
  123.         move.l    pt_address(a0),pp_address
  124.         move.b    #6,pp_wait
  125.         move.b    #1,pp_waitcnt
  126.         clr.w    pp_nullwave
  127.         move.w    #$000F,$DFF096
  128.  
  129.         lea    pp_variables(PC),a0
  130.         lea    $DFF0A0,a1
  131.         moveq    #1,d1
  132.         move.w    #$80,d2
  133.         moveq    #4-1,d0
  134. .l2:        move.w    #0,8(a1)
  135.         move.w    d2,(a0)        ;pv_waveoffset
  136.         move.w    d1,pv_dmacon(a0)
  137.         move.l    a1,pv_custbase(a0)
  138.         move.l    #pp_periods,pv_peraddress(a0)
  139.         move.w    #1019,pv_pers(a0)
  140.         clr.w    pv_pers+2(a0)
  141.         clr.w    pv_pers+4(a0)
  142.         clr.l    pv_por(a0)
  143.         clr.w    pv_porlevel(a0)
  144.         clr.l    pv_vib(a0)
  145.         clr.l    pv_vol(a0)
  146.         move.w    #$40,pv_vollevel(a0)
  147.         clr.l    pv_phase(a0)
  148.         clr.w    pv_vibcnt(a0)
  149.         clr.b    pv_flags(a0)
  150.         add.w    #pv_sizeof,a0
  151.         add.w    #$10,a1
  152.         add.w    d1,d1
  153.         add.w    #$40,d2
  154.         dbra    d0,.l2
  155.  
  156.         bset    #1,$BFE001
  157. ; !!!!
  158.         pop.l    d0-d7/a0-a6
  159. ; !!!!
  160.         rts
  161.  
  162.     *** Clean-up routine ***
  163.  
  164. _pp_end:
  165. ; !!!!
  166.         push.l    d0-d7/a0-a6
  167. ; !!!!
  168.         moveq    #0,d0
  169.         lea    $DFF000,a0
  170.         move.w    d0,$A8(a0)
  171.         move.w    d0,$B8(a0)
  172.         move.w    d0,$C8(a0)
  173.         move.w    d0,$D8(a0)
  174.         move.w    #$000F,$96(a0)
  175. ;        bclr    #1,$BFE001
  176. ; !!!!
  177.     pop.l    d0-d7/a0-a6
  178.     moveq.l    #0,d0
  179. ; !!!!
  180.         rts
  181. _pp_music:
  182.     push.l    d0-d7/a0-a6
  183.     bsr.s    pp_play
  184.     pop.l    d0-d7/a0-a6
  185.     rts
  186.  
  187.     *** Play routine ***
  188.  
  189. pp_play:        lea    $DFF000,a6
  190.         subq.b    #1,pp_waitcnt
  191.         bne.s    .l0
  192.         bsr    pp_nwnt
  193.         move.b    pp_wait(PC),pp_waitcnt
  194.  
  195. .l0:        lea    pp_variables(PC),a1
  196.         bsr.s    pp_uvs
  197.         lea    pp_variables+pv_sizeof(PC),a1
  198.         bsr.s    pp_uvs
  199.         lea    pp_variables+2*pv_sizeof(PC),a1
  200.         bsr.s    pp_uvs
  201.         lea    pp_variables+3*pv_sizeof(PC),a1
  202.  
  203. pp_uvs:        move.l    pv_custbase(a1),a0
  204.  
  205. .l0:        move.w    pv_pers(a1),d0
  206.         bne.s    .l1
  207.         bsr    pp_rot
  208.         bra.s    .l0
  209. .l1:        add.w    pv_por(a1),d0
  210.         tst.w    pv_por(a1)
  211.         beq.s    .l1c
  212.         bpl.s    .l1a
  213.         cmp.w    pv_porlevel(a1),d0
  214.         bge.s    .l1c
  215.         bra.s    .l1b
  216. .l1a:        cmp.w    pv_porlevel(a1),d0
  217.         ble.s    .l1c
  218. .l1b:        move.w    pv_porlevel(a1),d0
  219.  
  220. .l1c:        add.w    pv_vib(a1),d0
  221.         cmp.w    #135,d0
  222.         bge.s    .l1d
  223.         move.w    #135,d0
  224.         bra.s    .l1e
  225. .l1d:        cmp.w    #1019,d0
  226.         ble.s    .l1e
  227.         move.w    #1019,d0
  228. .l1e:        move.w    d0,6(a0)
  229.         bsr    pp_rot
  230.  
  231.         move.w    pv_deltapor(a1),d0
  232.         add.w    d0,pv_por(a1)
  233.         cmp.w    #-1019,pv_por(a1)
  234.         bge.s    .l3
  235.         move.w    #-1019,pv_por(a1)
  236.         bra.s    .l5
  237. .l3:        cmp.w    #1019,pv_por(a1)
  238.         ble.s    .l5
  239.         move.w    #1019,pv_por(a1)
  240.  
  241. .l5:        tst.b    pv_vibcnt(a1)
  242.         beq.s    .l7
  243.         move.w    pv_deltavib(a1),d0
  244.         add.w    d0,pv_vib(a1)
  245.         subq.b    #1,pv_vibcnt(a1)
  246.         bne.s    .l7
  247.         neg.w    pv_deltavib(a1)
  248.         move.b    pv_vibmax(a1),pv_vibcnt(a1)
  249.  
  250. .l7:        move.w    pv_dmacon(a1),d0
  251.         move.w    pv_vol(a1),8(a0)
  252.         move.w    pv_deltavol(a1),d0
  253.         add.w    d0,pv_vol(a1)
  254.         tst.w    pv_vol(a1)
  255.         bpl.s    .l8
  256.         clr.w    pv_vol(a1)
  257.         bra.s    .la
  258. .l8:        cmp.w    #$40,pv_vol(a1)
  259.         ble.s    .la
  260.         move.w    #$40,pv_vol(a1)
  261.  
  262. .la:        btst    #1,pv_flags(a1)
  263.         beq.s    .l10
  264.         tst.w    pv_deltaphase(a1)
  265.         beq.s    .l10
  266.         bpl.s    .sk
  267.         clr.w    pv_deltaphase(a1)
  268. .sk:        move.l    pv_insaddress(a1),a0
  269.         move.w    (a1),d0        ;pv_waveoffset
  270.         neg.w    d0
  271.         lea    (a0,d0.w),a2
  272.         move.l    a2,a3
  273.         move.w    pv_phase(a1),d0
  274.         lsr.w    #2,d0
  275.         add.w    d0,a3
  276.  
  277.         moveq    #$40-1,d0
  278. .lb:        move.b    (a2)+,d1
  279.         ext.w    d1
  280.         move.b    (a3)+,d2
  281.         ext.w    d2
  282.         add.w    d1,d2
  283.         asr.w    #1,d2
  284.         move.b    d2,(a0)+
  285.         dbra    d0,.lb
  286.  
  287.         move.w    pv_deltaphase(a1),d0
  288.         add.w    d0,pv_phase(a1)
  289.         cmp.w    #$100,pv_phase(a1)
  290.         blt.s    .l10
  291.         sub.w    #$100,pv_phase(a1)
  292.  
  293. .l10:        rts
  294.  
  295. pp_rot:        move.w    pv_pers(a1),d0
  296.         move.w    pv_pers+2(a1),pv_pers(a1)
  297.         move.w    pv_pers+4(a1),pv_pers+2(a1)
  298.         move.w    d0,pv_pers+4(a1)
  299.         rts
  300.  
  301. pp_nwnt:        move.l    pp_address(PC),a0
  302.         add.l    #4*nt_sizeof,pp_address
  303.         subq.b    #1,pp_notecnt
  304.         bne.s    .l5
  305.  
  306. .l0:        addq.l    #2,pp_songptr
  307.         subq.w    #1,pp_songcnt
  308.         bne.s    .l1
  309.         move.l    songtable(PC),pp_songptr
  310.         move.w    songlen(PC),pp_songcnt
  311. .l1:        move.l    pp_songptr(PC),a1
  312.         move.w    (a1),d0
  313.         mulu    #pt_sizeof,d0
  314.         add.l    patttable(PC),d0
  315.         move.l    d0,a1
  316.         move.b    pt_size+1(a1),pp_notecnt
  317.         move.l    pt_address(a1),pp_address
  318.  
  319. .l5:        clr.w    pp_tmpdmacon
  320.         lea    pp_variables(PC),a1
  321.         bsr    pp_nnt
  322.         addq.w    #nt_sizeof,a0
  323.         lea    pp_variables+pv_sizeof(PC),a1
  324.         bsr    pp_nnt
  325.         addq.w    #nt_sizeof,a0
  326.         lea    pp_variables+2*pv_sizeof(PC),a1
  327.         bsr    pp_nnt
  328.         addq.w    #nt_sizeof,a0
  329.         lea    pp_variables+3*pv_sizeof(PC),a1
  330.         bsr    pp_nnt
  331.  
  332.         move.w    pp_tmpdmacon(PC),$96(a6)
  333.  
  334.         move.w    #DMAWAIT-1,d0
  335. .loop1:        dbra    d0,.loop1
  336.  
  337.         lea    pp_variables(PC),a1
  338.         bsr.s    pp_scr
  339.         lea    pp_variables+pv_sizeof(PC),a1
  340.         bsr.s    pp_scr
  341.         lea    pp_variables+2*pv_sizeof(PC),a1
  342.         bsr.s    pp_scr
  343.         lea    pp_variables+3*pv_sizeof(PC),a1
  344.         bsr.s    pp_scr
  345.  
  346.         bset    #7,pp_tmpdmacon
  347.         move.w    pp_tmpdmacon(PC),$96(a6)
  348.  
  349.         move.w    #DMAWAIT-1,d0
  350. .loop2:        dbra    d0,.loop2
  351.  
  352.         move.l    pp_variables+pv_insaddress(PC),$A0(a6)
  353.         move.w    pp_variables+pv_inslen(PC),$A4(a6)
  354.         move.l    pp_variables+pv_sizeof+pv_insaddress(PC),$B0(a6)
  355.         move.w    pp_variables+pv_sizeof+pv_inslen(PC),$B4(a6)
  356.         move.l    pp_variables+2*pv_sizeof+pv_insaddress(PC),$C0(a6)
  357.         move.w    pp_variables+2*pv_sizeof+pv_inslen(PC),$C4(a6)
  358.         move.l    pp_variables+3*pv_sizeof+pv_insaddress(PC),$D0(a6)
  359.         move.w    pp_variables+3*pv_sizeof+pv_inslen(PC),$D4(a6)
  360.  
  361.         rts
  362.  
  363. pp_scr:        move.w    pp_tmpdmacon(PC),d0
  364.         and.w    pv_dmacon(a1),d0
  365.         beq.s    .l5
  366.  
  367.         move.l    pv_custbase(a1),a0
  368.         move.l    pv_insaddress(a1),(a0)
  369.         move.w    pv_inslen(a1),4(a0)
  370.         move.w    pv_pers(a1),6(a0)
  371.         btst    #0,pv_flags(a1)
  372.         bne.s    .l5
  373.         move.l    #pp_nullwave,pv_insaddress(a1)
  374.         move.w    #1,pv_inslen(a1)
  375.  
  376. .l5:        rts
  377.  
  378. pp_nnt:        move.b    (a0),d1        ;nt_period
  379.         beq    .l5
  380.  
  381.         and.l    #$000000FF,d1
  382.         add.w    d1,d1
  383.         add.l    #pp_periods-2,d1
  384.         move.l    d1,a2
  385.  
  386.         btst    #6,nt_speed(a0)
  387.         beq.s    .l2
  388.         move.w    (a2),pv_porlevel(a1)
  389.         bra.s    .l5
  390.  
  391. .l2:        move.w    pv_dmacon(a1),d0
  392.         or.w    d0,pp_tmpdmacon
  393.  
  394.         move.l    a2,pv_peraddress(a1)
  395.         move.w    (a2),pv_pers(a1)
  396.         move.w    (a2),pv_pers+2(a1)
  397.         move.w    (a2),pv_pers+4(a1)
  398.  
  399.         clr.w    pv_por(a1)
  400.  
  401.         move.b    nt_instr(a0),d0
  402.         ext.w    d0
  403.         mulu    #it_sizeof,d0
  404.         add.l    instable(PC),d0
  405.         move.l    d0,a2
  406.         tst.l    it_address(a2)
  407.         bne.s    .l1
  408.         move.l    #pp_nullwave,pv_insaddress(a1)
  409.         move.w    #1,pv_inslen(a1)
  410.         clr.b    pv_flags(a1)
  411.         bra.s    .l5
  412.  
  413. .l1:        move.l    it_address(a2),a3
  414.         btst    #1,it_flags(a2)
  415.         bne.s    .l0a
  416.         move.l    it_size(a2),d0
  417.         lsr.l    #1,d0
  418.         move.w    d0,pv_inslen(a1)
  419.         bra.s    .l0
  420. .l0a:        move.w    (a1),d0        ;pv_waveoffset
  421.         add.w    d0,a3
  422.         move.w    #$20,pv_inslen(a1)
  423. .l0:        move.l    a3,pv_insaddress(a1)
  424.         move.b    it_flags(a2),pv_flags(a1)
  425.         move.w    pv_vollevel(a1),pv_vol(a1)
  426.  
  427. .l5:        move.b    nt_speed(a0),d0
  428.         and.b    #$0F,d0
  429.         beq.s    .l6
  430.         move.b    d0,pp_wait
  431.  
  432. .l6:        move.l    pv_peraddress(a1),a2
  433.         move.b    nt_arpeggio(a0),d0
  434.         beq.s    .l9
  435.         cmp.b    #$FF,d0
  436.         bne.s    .l7
  437.         move.w    (a2),pv_pers(a1)
  438.         move.w    (a2),pv_pers+2(a1)
  439.         move.w    (a2),pv_pers+4(a1)
  440.         bra.s    .l9
  441.  
  442. .l7:        and.b    #$0F,d0
  443.         add.b    d0,d0
  444.         ext.w    d0
  445.         move.w    (a2,d0.w),pv_pers+4(a1)
  446.         move.b    nt_arpeggio(a0),d0
  447.         lsr.b    #4,d0
  448.         add.b    d0,d0
  449.         ext.w    d0
  450.         move.w    (a2,d0.w),pv_pers+2(a1)
  451.         move.w    (a2),pv_pers(a1)
  452.  
  453. .l9:        move.b    nt_vibrato(a0),d0
  454.         beq.s    .ld
  455.         cmp.b    #$FF,d0
  456.         bne.s    .la
  457.         clr.l    pv_vib(a1)
  458.         clr.b    pv_vibcnt(a1)
  459.         bra.s    .ld
  460. .la:        clr.w    pv_vib(a1)
  461.         and.b    #$0F,d0
  462.         ext.w    d0
  463.         move.w    d0,pv_deltavib(a1)
  464.         move.b    nt_vibrato(a0),d0
  465.         lsr.b    #4,d0
  466.         move.b    d0,pv_vibmax(a1)
  467.         lsr.b    #1,d0
  468.         move.b    d0,pv_vibcnt(a1)
  469.  
  470. .ld:        move.b    nt_phase(a0),d0
  471.         beq.s    .l10
  472.         cmp.b    #$FF,d0
  473.         bne.s    .le
  474.         clr.w    pv_phase(a1)
  475.         move.w    #$FFFF,pv_deltaphase(a1)
  476.         bra.s    .l10
  477. .le:        and.b    #$0F,d0
  478.         ext.w    d0
  479.         move.w    d0,pv_deltaphase(a1)
  480.         clr.w    pv_phase(a1)
  481.  
  482. .l10:        move.b    nt_volume(a0),d0
  483.         bne.s    .l10a
  484.         btst    #7,nt_speed(a0)
  485.         beq.s    .l16
  486.         bra.s    .l11a
  487. .l10a:        cmp.b    #$FF,d0
  488.         bne.s    .l11
  489.         clr.w    pv_deltavol(a1)
  490.         bra.s    .l16
  491. .l11:        btst    #7,nt_speed(a0)
  492.         beq.s    .l12
  493. .l11a:        move.b    d0,pv_vol+1(a1)
  494.         move.b    d0,pv_vollevel+1(a1)
  495.         clr.w    pv_deltavol(a1)
  496.         bra.s    .l16
  497. .l12:        bclr    #7,d0
  498.         beq.s    .l13
  499.         neg.b    d0
  500. .l13:        ext.w    d0
  501.         move.w    d0,pv_deltavol(a1)
  502.  
  503. .l16:        move.b    nt_porta(a0),d0
  504.         beq.s    .l1a
  505.         cmp.b    #$FF,d0
  506.         bne.s    .l17
  507.         clr.l    pv_por(a1)
  508.         bra.s    .l1a
  509. .l17:        clr.w    pv_por(a1)
  510.         btst    #6,nt_speed(a0)
  511.         beq.s    .l17a
  512.         move.w    pv_porlevel(a1),d1
  513.         cmp.w    pv_pers(a1),d1
  514.         bgt.s    .l17c
  515.         neg.b    d0
  516.         bra.s    .l17c
  517.  
  518. .l17a:        bclr    #7,d0
  519.         bne.s    .l18
  520.         neg.b    d0
  521.         move.w    #135,pv_porlevel(a1)
  522.         bra.s    .l17c
  523.  
  524. .l18:        move.w    #1019,pv_porlevel(a1)
  525. .l17c:        ext.w    d0
  526. .l18a:        move.w    d0,pv_deltapor(a1)
  527.  
  528. .l1a:        rts
  529.  
  530.     *** Data section ***
  531.  
  532. pp_periods:    DC.W    1019,962,908,857,809,763,720,680,642,606,572,540
  533.         DC.W    509,481,454,428,404,381,360,340,321,303,286,270
  534.         DC.W    254,240,227,214,202,190,180,170,160,151,143,135
  535.         DC.W    135,135,135,135,135,135,135,135,135
  536.         DC.W    135,135,135,135,135,135
  537.  
  538. songlen:        DS.W    1
  539. songtable:    DS.L    1
  540. instable:        DS.L    1
  541. patttable:    DS.L    1
  542.  
  543. pp_wait:        DS.B    1
  544. pp_waitcnt:    DS.B    1
  545. pp_notecnt:    DS.B    1
  546. pp_address:    DS.L    1
  547. pp_songptr:    DS.L    1
  548. pp_songcnt:    DS.W    1
  549. pp_pattentry:    DS.L    1
  550. pp_tmpdmacon:    DS.W    1
  551. pp_variables:    DS.B    4*48
  552.  
  553. pp_nullwave:    DS.W    1
  554.  
  555.